package com.tecnick.jxhtmledit;

/*
 *
 * Modified for use in the content type additions.
Core SWING Advanced Programming
By Kim Topley
ISBN: 0 13 083292 8
Publisher: Prentice Hall
 */

import java.awt.Font;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;


//class DnDUtils {
//
//    public static String showActions(int action) {
//        String actions = "";
//        if ((action & (DnDConstants.ACTION_LINK | DnDConstants.ACTION_COPY_OR_MOVE)) == 0) {
//            return "None";
//        }
//
//        if ((action & DnDConstants.ACTION_COPY) != 0) {
//            actions += "Copy ";
//        }
//
//        if ((action & DnDConstants.ACTION_MOVE) != 0) {
//            actions += "Move ";
//        }
//
//        if ((action & DnDConstants.ACTION_LINK) != 0) {
//            actions += "Link";
//        }
//
//        return actions;
//    }
//
//    public static boolean isDebugEnabled() {
//        return debugEnabled;
//    }
//
//    public static void debugPrintln(String s) {
//        if (debugEnabled) {
//            System.out.println(s);
//        }
//    }
//    private static boolean debugEnabled = (System.getProperty("DnDExamples.debug") != null);
//}
public class CMSJLabelDragSource implements DragGestureListener,
        DragSourceListener {
    CMSTag payload;
    public CMSJLabelDragSource(JLabel label, String payload) {
        this.label = label;
        this.payload = new CMSTag(payload);
        // Use the default DragSource
        DragSource dragSource = DragSource.getDefaultDragSource();

        // Create a DragGestureRecognizer and
        // register as the listener
        dragSource.createDefaultDragGestureRecognizer(label,
                DnDConstants.ACTION_COPY_OR_MOVE, this);
    }

    // Implementation of DragGestureListener interface.
    public void dragGestureRecognized(DragGestureEvent dge) {
//        if (DnDUtils.isDebugEnabled()) {
//            DnDUtils.debugPrintln("Initiating event is "
//                    + dge.getTriggerEvent());
//            DnDUtils.debugPrintln("Complete event set is:");
//            Iterator iter = dge.iterator();
//            while (iter.hasNext()) {
//                DnDUtils.debugPrintln("\t" + iter.next());
//            }
//        }
        Transferable transferable = new JLabelTransferable(label, this.payload);
        dge.startDrag(null, transferable, this);
    }

    // Implementation of DragSourceListener interface
    public void dragEnter(DragSourceDragEvent dsde) {
//        DnDUtils.debugPrintln("Drag Source: dragEnter, drop action = "
//                + DnDUtils.showActions(dsde.getDropAction()));
    }

    public void dragOver(DragSourceDragEvent dsde) {
//        DnDUtils.debugPrintln("Drag Source: dragOver, drop action = "
//                + DnDUtils.showActions(dsde.getDropAction()));
    }

    public void dragExit(DragSourceEvent dse) {
//        DnDUtils.debugPrintln("Drag Source: dragExit");
    }

    public void dropActionChanged(DragSourceDragEvent dsde) {
//        DnDUtils.debugPrintln("Drag Source: dropActionChanged, drop action = "
//                + DnDUtils.showActions(dsde.getDropAction()));
    }

    public void dragDropEnd(DragSourceDropEvent dsde) {
//        DnDUtils.debugPrintln("Drag Source: drop completed, drop action = "
//                + DnDUtils.showActions(dsde.getDropAction()) + ", success: "
//                + dsde.getDropSuccess());
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception evt) {
        }

        JFrame f = new JFrame("Draggable JLabel");
        JLabel label = new JLabel("Drag this text", JLabel.CENTER);
        label.setFont(new Font("Serif", Font.BOLD, 32));
        f.getContentPane().add(label);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.pack();
        f.setVisible(true);

        // Attach the drag source
        CMSJLabelDragSource dragSource = new CMSJLabelDragSource(label, "The real content");
    }
    protected JLabel label; // The associated JLabel
}

class JLabelTransferable implements Transferable {

    Object payload;
    public JLabelTransferable(JLabel label, Object payload) {
        this.label = label;
        this.payload = payload;
    }

    // Implementation of the Transferable interface
    public DataFlavor[] getTransferDataFlavors() {
        return flavors;
    }

    public boolean isDataFlavorSupported(DataFlavor fl) {
        for (int i = 0; i < flavors.length; i++) {
            if (fl.equals(flavors[i])) {
                return true;
            }
        }

        return false;
    }

    public Object getTransferData(DataFlavor fl) {
        if (!isDataFlavorSupported(fl)) {
            return null;
        }

        if (fl.equals(new DataFlavor(CMSTag.class, "CMSTag"))) {
            // String - return the text as a String
            return ((CMSTag) payload).tag_value;
            //return label.getText();// + " (DataFlavor.stringFlavor)";
        //} else if (fl.equals(jLabelFlavor)) {
            // The JLabel itself - just return the label.
        //    return label;
        } else {
            // Plain text - return an InputStream
            try {
                String targetText = ((CMSTag) payload).tag_value; //label.getText();// + " (plain text flavor)";
                int length = targetText.length();
                ByteArrayOutputStream os = new ByteArrayOutputStream();
                OutputStreamWriter w = new OutputStreamWriter(os);
                w.write(targetText, 0, length);
                w.flush();
                byte[] bytes = os.toByteArray();
                w.close();
                return new ByteArrayInputStream(bytes);
            } catch (IOException e) {
                return null;
            }
        }
    }
    // A flavor that transfers a copy of the JLabel
    public static final DataFlavor jLabelFlavor = new DataFlavor(JLabel.class,
            "Swing JLabel");
    private JLabel label; // The label being transferred
    private static final DataFlavor[] flavors = new DataFlavor[]{
        new DataFlavor(CMSTag.class, "CMSTag"),
        DataFlavor.stringFlavor,
        new DataFlavor("text/plain; charset=ascii", "ASCII text")};//,
        //jLabelFlavor};
}
